'''
@Company: TWL
@Author: xue jian
@Email: xuejian@kanzhun.com
@Date: 2020-07-24 08:39:16
'''
'''
1025. 除数博弈
爱丽丝和鲍勃一起玩游戏，他们轮流行动。爱丽丝先手开局。

最初，黑板上有一个数字 N 。在每个玩家的回合，玩家需要执行以下操作：

选出任一 x，满足 0 < x < N 且 N % x == 0 。
用 N - x 替换黑板上的数字 N 。
如果玩家无法执行这些操作，就会输掉游戏。

只有在爱丽丝在游戏中取得胜利时才返回 True，否则返回 false。假设两个玩家都以最佳状态参与游戏。

 

示例 1：

输入：2
输出：true
解释：爱丽丝选择 1，鲍勃无法进行操作。
示例 2：

输入：3
输出：false
解释：爱丽丝选择 1，鲍勃也选择 1，然后爱丽丝无法进行操作。
 

提示：

1 <= N <= 1000


tips:典型dp，与winnerSquareGame思路类似，即dp[n]表示n状态下alice是否能赢。根据规则判断，dp[n]需要从n的约数
中找寻a可以相减并导致dp[n-a]（表示bob能不能赢）为false的方案，能找到一个即可。
'''

class Solution:
    def divisorGame(self, N: int) -> bool:
        dp = [False]*(N+1)
        dp[0] = True
        dp[1] = False
        if N <2:
            return False
        for i in range(2, N+1):
            for j in range(1, i//2+1):
                if dp[i]:
                    break
                if i%j == 0:
                    dp[i] = dp[i]|(not dp[i-j])
        return dp[N]        
if __name__ == "__main__":
    solution = Solution()
    N = 101
    print(solution.divisorGame(N))